#include <stdio.h>
#include <signal.h>

// 当gcc优化编译后，会把flag放到寄存器中，捕获到信号进入handler函数
// 修改flag，发现只是修改内存中的flag，而while循环中只是检测寄存器中的flag
// 因此使用volatile关键字修饰，让编译器不优化被volatile关键字修饰的变量
// 所以修饰的变量必须放在真实内存中进行操作
volatile int flag = 0;

void handler(int signo)
{
  flag = 1;
  printf("signo %d -> flag from 0 to 1\n", signo);
}

int main()
{
  signal(2, handler);
  while(!flag);
  printf("process exit normal\n");
  return 0;
}
